<?php 
/**
* 
*/
class DCRegexTool{
	//定义一个私有成员，用来存放一些常用的正则表达式
	private $validate = array(
		'require' => '/.+/',
		'email' => '/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/',
		'url' => '/^http(s?):\/\/(?:[A-za-z0-9-]+\.)+[A-za-z]{2,4}(?:[\/\?#][\/=\?%\-&~`@[\]\':+!\.#\w]*)?$/',
		'currency' => '/^\d+(\.\d+)?$/',
		'number' => '/^\d+$/',
		'zip' => '/^\d{6}$/',
		'integer' => '/^[-\+]?\d+$/',
		'double' => '/^[-\+]?\d+(\.\d+)?$/',
		'english' => '/[A-Za-z]+$/',
		'qq' => '/^\d{5,11}$/',
		'mobile' => '/^1(3|4|5|6|7|8)\d{9}$/',
	);

	//再定义一个私有成员，作用是定义它返回的结果，到底是让它返回是否匹配，还是把匹配到的结果全部返回到用户端。
	//也就是说当这个变量$returnMatchResult，这个成员属性为false的时候，只返回验证的结果是真还是假。如果值为true，返回去的是匹配到的结果的数组。
	private $returnMatchResult = false;
	//再定义一个成员变量用来存放修正模式，默认为空
	private $fixMode = null;
	//再定义2个成员变量，第1个是匹配的结果数组，第2个为验证的结果，验证成功返回true，验证失败返回false。
	private $matches = array();
	private $isMatch = false;

	//定义一个构造函数(这样在实例化这个对象的时候，可以定义这个对象返回的是哪种类型并且给它定义一个修正模式。)
	public function __construct($returnMatchResult = false,$fixMode = null){
		//把这2个参数赋值给这个类的私有成员
		$this->returnMatchResult = $returnMatchResult;
		$this->fixMode = $fixMode;
	}


	private function regex($pattern,$subject){
		if(array_key_exists(strtolower($pattern), $this->validate)){
			$pattern = $this->validate[$pattern].$this->fixMode;
		}
		$this->returnMatchResult ? preg_match_all($pattern,$subject,$this->$matches) : $this->isMatch = preg_match($pattern,$subject) === 1;
		return $this->getRegexResult();
	}

	private function getRegexResult(){
		if($this->returnMatchResult){
			return $this->matches;
		}else{
			return $this->isMatch;
		}
	}

	public function toggleReturnType($bool = null){
		if(empty($bool)){
			$this->returnMatchResult = !$this->returnMatchResult;
		}else{
			$this->returnMatchResult = is_bool($bool) ? $bool : (bool)$bool;
		}
	}	

	public function setFixMode($fixMode){
		$this->fixMode = $fixMode;
	}

	public function noEmpty($str){
		//验证数据是否为空，返回结果由regex函数来确定。$validate里已经有检测非空的正则表达式require，直接传递进去。
		//return $this->regex($pattern,$subject);
		return $this->regex('require',$str);	
	}
	//验证Email是否正确的方法
	public function isEmail($email){
		return $this->regex('email',$email);
	}
	//验证手机号是否正确的方法
	public function isMobile($mobile){
		return $this->regex('mobile',$mobile);
	}
	//定义一个用户自定义正则表达式的验证方法
	public function check($pattern,$subject){
		return $this->regex($pattern,$subject);
	}

}









